/*
 * Copyright (c) 2003-2005 by www.sanv.org
 * All rights reserved.
 */

package com.framework.dao;

import java.util.List;

import org.springframework.orm.ibatis3.support.SqlSessionDaoSupport;
import org.springframework.stereotype.Component;

import com.framework.model.IData;
import com.framework.model.IDataModel;

@Component
public class IbatisDao extends SqlSessionDaoSupport
{

    /*
     * 以下9个函数是Dao的默认实现,一般情况下,你可以直接使用他们 public Object getObjectInfo(String ,
     * Object ); public List getObjectList(String , Object ); public Object
     * insertObject(String , Object ); public int insertObjectAndGetID(String ,
     * Object ); public int updateObject(String , Object ); public int
     * deleteObject(String , Object ); public boolean checkObjectExists(String ,
     * Object ); public int getRecordCount(String , Object ); public List
     * getPageObjectList(String , Object ,int , int );
     */

    /**
     * 根据conditionObjInfo对象中的条件，从数据库中取得对对象。
     * 这是一个默认的实现，必须对应statementId为getObjectInfo
     */
    public Object getObjectInfo(String sqlMapNameSpace, Object conditionObjInfo)
    {
        return getSqlSessionTemplate().selectOne(
                sqlMapNameSpace + ".getObjectInfo", conditionObjInfo);
    }

    /**
     * 根据conditionObjInfo对象中的条件，从数据库中取得多个对象。
     * 这是一个默认的实现，必须对应statementId为getObjectList
     */
    @SuppressWarnings("unchecked")
	public List getObjectList(String sqlMapNameSpace, Object conditionObjInfo)
    {
        return getSqlSessionTemplate().selectList(
                sqlMapNameSpace + ".getObjectList", conditionObjInfo);
    }

    /**
     * 向数据库中插入一条记录，数据被封装在info对象中。 这是一个默认的实现，必须对应statementId为insertObject
     */
    public Object insertObject(String sqlMapNameSpace, Object objInfo)
    {
        return getSqlSessionTemplate().insert(
                sqlMapNameSpace + ".insertObject", objInfo);
    }

    /**
     * 向数据库中插入一条记录并返回刚插入的ID，数据被封装在info对象中。
     * 这是一个默认的实现，必须对应statementId为insertObjectAndGetID
     */
    public int insertObjectAndGetID(String sqlMapNameSpace, Object objInfo)
    {
        return ((Integer) getSqlSessionTemplate().insert(
                sqlMapNameSpace + ".insertObjectAndGetID", objInfo)).intValue();
    }

    /**
     * 更新数据库中的记录 这是一个默认的实现，必须对应statementId为updateObject
     */
    public int updateObject(String sqlMapNameSpace, Object objInfo)
    {
        return getSqlSessionTemplate().update(
                sqlMapNameSpace + ".updateObject", objInfo);
    }

    /**
     * 删除数据库中的记录 这是一个默认的实现，必须对应statementId为deleteObject
     */
    public int deleteObject(String sqlMapNameSpace, Object conditionObjInfo)
    {
        return getSqlSessionTemplate().delete(
                sqlMapNameSpace + ".deleteObject", conditionObjInfo);
    }

    /**
     * 检查数据库中是否已经存在此记录，若存在返回true;否则，返回false。
     * 这是一个默认的实现，必须对应statementId为checkObjectExists
     */
    public boolean checkObjectExists(String sqlMapNameSpace,
            Object conditionObjInfo)
    {
    	
    	Object obj = getSqlSessionTemplate().selectOne(
                sqlMapNameSpace + ".checkObjectExists", conditionObjInfo);
    	if(obj==null){
    		return false;
    	}else{
    		 return ((Integer)obj > 0) ? true : false;
    	}
    }

    /**
     * getPageObjectList(String,Object,int,int);根据conditionObjInfo条件从数据库中取出从intStart开始起的intOffset条记录集
     * 这是一个默认的实现，必须对应statementId为getObjectPageList,同时必须配合getRecordCount(String ,
     * Object)使用
     * 
     * getRecordCount(String , Object)实现从数据库中取得对象的个数也可独立使用。
     * 这是一个默认的实现，必须对应statementId为getRecordCount
     */
    public int getRecordCount(String sqlMapNameSpace, Object conditionObjInfo)
    {
        Object obj = getSqlSessionTemplate().selectOne( sqlMapNameSpace + ".getRecordCount", conditionObjInfo);
        if(obj == null)
        {
            return 0;
        }
        else
        {
            return ((Integer)obj).intValue();
        }
    }

    @SuppressWarnings("unchecked")
	public List getPageObjectList(String sqlMapNameSpace,
            IData conditionObjInfo, int intStart, int intOffset)
    {
      
    	conditionObjInfo.put("intStart", new Integer(intStart));
    	conditionObjInfo.put("intOffset", new Integer(intOffset));
            
        return getSqlSessionTemplate().selectList(
                sqlMapNameSpace + ".getPageObjectList", conditionObjInfo);
    }
    
    
    @SuppressWarnings("unchecked")
	public List getPageObjectList(String sqlMapNameSpace,
			IDataModel conditionObjInfo, int intStart, int intOffset)
    {
    	conditionObjInfo.setIntStart(intStart);
    	conditionObjInfo.setIntOffset(intOffset);
        return getSqlSessionTemplate().selectList(
                sqlMapNameSpace + ".getPageObjectList", conditionObjInfo);
    }
    
    

    @SuppressWarnings("unchecked")
    public List getPageObjectList(String sqlMapNameSpace,
            Object conditionObjInfo)
    {
            
        return getSqlSessionTemplate().selectList(
                sqlMapNameSpace + ".getPageObjectList", conditionObjInfo);
    }
    
    /*
     * 以下9个函数是Dao提供的自定义实现,你可以使用你自己的statmentId完成不同的操作 public Object
     * getObjectInfo(String , String , Object ); public List
     * getObjectList(String , String , Object ); public Object
     * insertObject(String , String , Object ); public int
     * insertObjectAndGetID(String , String , Object ); public int
     * updateObject(String , String , Object ); public int deleteObject(String ,
     * String , Object ); public boolean checkObjectExists(String , String ,
     * Object ); public int getRecordCount(String , String , Object ); public
     * List getPageObjectList(String , String , Object ,int , int );
     */

    /**
     * 根据conditionObjInfo对象中的条件，从数据库中取得对对象。 这是一个自定义的实现，你可以使用你自己设定的statementId
     */
    public Object getObjectInfo(String sqlMapNameSpace, String statementId,
            Object conditionObjInfo)
    {
        return getSqlSessionTemplate().selectOne(
                sqlMapNameSpace + "." + statementId, conditionObjInfo);
    }

    /**
     * 根据conditionObjInfo对象中的条件，从数据库中取得多个对象。 这是一个自定义的实现，你可以使用你自己设定的statementId
     */
    @SuppressWarnings("unchecked")
	public List getObjectList(String sqlMapNameSpace, String statementId,
            Object conditionObjInfo)
    {
        return getSqlSessionTemplate().selectList(
                sqlMapNameSpace + "." + statementId, conditionObjInfo);
    }

    /**
     * 向数据库中插入一条记录，数据被封装在info对象中。 这是一个自定义的实现，你可以使用你自己设定的statementId
     */
    public Object insertObject(String sqlMapNameSpace, String statementId,
            Object objInfo)
    {
        return getSqlSessionTemplate().insert(
                sqlMapNameSpace + "." + statementId, objInfo);
    }

    /**
     * 向数据库中插入一条记录并返回刚插入的ID，数据被封装在info对象中。 这是一个自定义的实现，你可以使用你自己设定的statementId
     */
    public int insertObjectAndGetID(String sqlMapNameSpace, String statementId,
            Object objInfo)
    {
        return ((Integer) getSqlSessionTemplate().insert(
                sqlMapNameSpace + "." + statementId, objInfo)).intValue();
    }

    /**
     * 更新数据库中的记录 这是一个自定义的实现，你可以使用你自己设定的statementId
     */
    public int updateObject(String sqlMapNameSpace, String statementId,
            Object objInfo)
    {
        return getSqlSessionTemplate().update(
                sqlMapNameSpace + "." + statementId, objInfo);
    }

    /**
     * 删除数据库中的记录 这是一个自定义的实现，你可以使用你自己设定的statementId
     */
    public int deleteObject(String sqlMapNameSpace, String statementId,
            Object conditionObjInfo)
    {
        return getSqlSessionTemplate().delete(
                sqlMapNameSpace + "." + statementId, conditionObjInfo);
    }

    /**
     * 检查数据库中是否已经存在此记录，若存在返回true;否则，返回false。 这是一个自定义的实现，你可以使用你自己设定的statementId
     */
    public boolean checkObjectExists(String sqlMapNameSpace,
            String statementId, Object conditionObjInfo)
    {
        int number = ((Integer) getSqlSessionTemplate().selectOne(
                sqlMapNameSpace + "." + statementId, conditionObjInfo))
                .intValue();
        return (number > 0) ? true : false;
    }



}
